home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / alib / csup / clib / random.asm < prev    next >
Assembly Source File  |  1994-02-14  |  2KB  |  69 lines

  1. *******************************************************************************
  2. *                                          *
  3. * ranged random function -    generates random integer within a range       *
  4. *                                          *
  5. *    input:    range passed on top of stack (32 bit int) 1 <= range < 65536  *
  6. *                                          *
  7. *    output:    random number returned on d0 (16 bit int) 0 <= range < range  *
  8. *                                          *
  9. *    effects:d0                                  *
  10. *                                          *
  11. *******************************************************************************
  12.     section romhunks
  13. _RangeRan:
  14. _RangeRand:
  15.     movem.l    d5/d4,-(sp)    * save registers
  16.     move.w    14(sp),d5    * range in d5
  17.     move.w    d5,d4        * range-1 in d4 for counting # of randomizes
  18.     subq.w    #1,d4        *     log2(range-1) times
  19.     move.l    _RangeSeed,d0    * seed in d0
  20. *
  21. L1:
  22. *                * randomizing loop:
  23.     add.l    d0,d0        * shift seed left (add dn,dn is faster)
  24.     bhi.s    L2        * carry? (using bhi instead of bcc unlocks 0s)
  25.     eori.l    #$1D872B41,d0    * magic number for 32 bit seed
  26. L2:
  27.     lsr.w    #1,d4
  28.     bne.s    L1
  29. *
  30.     move.l    d0,_RangeSeed    * save new seed
  31.     tst.w    d5        * test for range == 0
  32.     bne.s    L3
  33.     swap    d0        * range == 0; return bits 0-15 of seed in d0
  34.     bra.s    L4
  35. L3:
  36.     mulu    d5,d0        * range > 0; multiply bits 0-15 of seed (fract)
  37. *     X range and return int part of product
  38. L4:
  39.     clr.w    d0
  40.     swap    d0
  41.     movem.l    (sp)+,d5/d4    * restore registers
  42.     rts
  43.     xdef    _RangeRan,_RangeRand
  44. *******************************************************************************
  45. *                                          *
  46. * fast random function -    generates fairly random integer quickly          *
  47. *                                          *
  48. *    input:    random seed passed on top of stack (32 bit int)              *
  49. *                                          *
  50. *    output:    new random seed returned on d0 (32 bit int)              *
  51. *                                          *
  52. *    effects:d0                                  *
  53. *                                          *
  54. *******************************************************************************
  55. _FastRand:
  56.     move.l    4(sp),d0    * seed in d5
  57.     add.l    d0,d0        * shift seed left (add dn,dn is faster)
  58.     bhi.s    L5        * carry? (using bhi instead of bcc unlocks 0s)
  59.     eori.l    #$1D872B41,d0    * magic number for 32 bit seed
  60. L5:
  61.     rts
  62.     xdef    _FastRand
  63.     data
  64.     xdef    _RangeSeed
  65. _RangeSeed:
  66.     dc.l    0        * random number seed
  67.  
  68.     end
  69.